﻿using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
using Controllers;
using Interfaces;
using Views.Annotations;


namespace Views.Moduler
{
    public partial class Afdelinger
    {
        #region Fields

        private readonly Controller _controller;

        private IAfdeling _selectedAfdeling;

        #endregion

        #region Properties

        #endregion

        #region Creation

        public Afdelinger(Controller controller)
        {
            InitializeComponent();

            _controller = controller;

            // gør filen tilgængelig i XAML delen
            this.DataContext = this;

            
            
            OpdaterAfdelingsListView();
            OpstartsTilstandsstyring();
        }

        #endregion

        #region Events

        private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var afdeling = (IAfdeling) ListViewAfdelinger.SelectedItem;
            _selectedAfdeling = afdeling;

            if (_selectedAfdeling != null)
            {
                if (_selectedAfdeling.Navn == "Ingen")
                {
                    BtnSlet.IsEnabled = false;
                    BtnRediger.IsEnabled = false;
                }
                else
                {
                    BtnSlet.IsEnabled = true;
                    BtnRediger.IsEnabled = true;
                }
            }
        }

        //Dobbelt klik på musen åbner detaljer op for en afdeling
        private void ListViewAfdelinger_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            var afdeling = (IAfdeling)ListViewAfdelinger.SelectedItem;
            _selectedAfdeling = afdeling;

            //Hvis der ikke er valgt et afdelings objekt returner metoden
            if (_selectedAfdeling == null || _selectedAfdeling.Navn == "Ingen") return;

            var afdelingsDetaljer = new AfdelingsDetaljer(_controller, _selectedAfdeling);
            afdelingsDetaljer.ShowDialog();
        }

        private void BtnOpret_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            VisTilføjBoks();
        }

        // event handler til sletning af afdeling.
        private void BtnSlet_OnClick(object sender, RoutedEventArgs e)
        {
            // der skal være valgt en afdeling
            if (_selectedAfdeling == null) return;

            if (MessageBox.Show("Er du sikker på at du vil slette afdeling " +
                                    _selectedAfdeling.Navn + "?",
                                    "Vil du slette?", MessageBoxButton.OKCancel, MessageBoxImage.Warning) ==
                    MessageBoxResult.OK)
            {
                bool slettet = _controller.FjernAfdeling(_selectedAfdeling);

                if (slettet)
                {
                    OpdaterAfdelingsListView();
                }
                else
                {
                    MessageBox.Show("Fejl ved sletning af afdeling.");
                }
            }
            SkjulGroupBox();
        }

        // event handler til visning af groupbox 
        private void BtnRediger_Click(object sender, RoutedEventArgs e)
        {
            // kald tilstandsstyrings metode
            VisRedigerBoks();
        }

        // event handler til redigering af valgt afdeling
        private void BtnRedigerAfdeling_OnClick(object sender, RoutedEventArgs e)
        {
            // hvis der ikke er valgt en afdeling, er der ikke noget at redigere
            if (_selectedAfdeling == null) return;

            string txt = TxtAfdelingNavn.Text;

            // validering af afdelingens nye navn 
            if (!String.IsNullOrEmpty(txt) &&
                !String.IsNullOrWhiteSpace(txt))
            {
                bool redigeret = _controller.RedigerAfdeling(_selectedAfdeling, txt);

                if (redigeret)
                {
                    OpdaterAfdelingsListView();
                    SkjulGroupBox();
                }
                else
                {
                    MessageBox.Show("Der skete en fejl ved opdatering af afdelingen.", 
                                    "Fejl", 
                                    MessageBoxButton.OK,
                                    MessageBoxImage.Error);
                }
            }
        }

        private void BtnTilføjAfdeling_OnClick(object sender, RoutedEventArgs e)
        {
            string txt = TxtAfdelingNavn.Text;

            // validering af afdelingens nye navn 
            if (!String.IsNullOrEmpty(txt) &&
                !String.IsNullOrWhiteSpace(txt))
            {
                bool oprettet = _controller.TilføjAfdeling(txt);

                if (oprettet)
                {
                    OpdaterAfdelingsListView();
                    SkjulGroupBox();
                }
                else
                {
                    MessageBox.Show("Der skete en fejl ved opdatering af afdelingen.",
                                    "Fejl",
                                    MessageBoxButton.OK,
                                    MessageBoxImage.Error);
                }
            }
        }

        #endregion

        #region Tilstandsstyring

        public void OpdaterSide()
        {
            SkjulGroupBox();
            OpdaterAfdelingsListView();
        }

        private void OpdaterAfdelingsListView()
        {
            ListViewAfdelinger.ItemsSource = _controller.HentAlleAfdelinger();
        }

        private void OpstartsTilstandsstyring()
        {
            SkjulGroupBox();
        }

        // tilstandsstyring til at vise boksen med redigering af afdeling
        private void VisRedigerBoks()
        {
            GroupBoxAfdeling.Visibility = Visibility.Visible;
            GroupBoxAfdeling.Header = "Rediger afdeling";

            TxtAfdelingNavn.Text = _selectedAfdeling.Navn;

            TxtAfdelingNavn.Focus();

            BtnRedigerAfdeling.IsDefault = true;
            BtnTilføjAfdeling.IsDefault = false;

            BtnRedigerAfdeling.Visibility = Visibility.Visible;
            BtnTilføjAfdeling.Visibility = Visibility.Collapsed;

            FocusAfdelingTextBox();
        }

        // tilstandsstyring til at vise boksen med tilføjelse af ny afdeling
        private void VisTilføjBoks()
        {
            GroupBoxAfdeling.Visibility = Visibility.Visible;
            GroupBoxAfdeling.Header = "Tilføj ny afdeling";

            BtnRedigerAfdeling.IsDefault = false;
            BtnTilføjAfdeling.IsDefault = true;

            BtnRedigerAfdeling.Visibility = Visibility.Collapsed;
            BtnTilføjAfdeling.Visibility = Visibility.Visible;

            TxtAfdelingNavn.Text = "";

            FocusAfdelingTextBox();
        }   
        
        // sæt fokus på txt box til afdelingens navn, og vælg alt tekst (hvis der er noget)
        public void FocusAfdelingTextBox()
        {
            // sæt focus på tekstbox, skal køre en Dispatcher tråd
            Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new ThreadStart(() =>
                {
                    TxtAfdelingNavn.Focus();
                    TxtAfdelingNavn.SelectAll();
                }));
        }

        private void SkjulGroupBox()
        {
            GroupBoxAfdeling.Visibility = Visibility.Collapsed;
            BtnRediger.IsEnabled = false;
            BtnSlet.IsEnabled = false;
            ListViewAfdelinger.SelectedItem = null;
        }

        #endregion

    }
}
